# -*- coding: utf-8 -*-
# author: sixmillions
# date: 4/7/2022

"""
数据类型转换：只需要将数据类型作为函数名即可
隐式类型转换 - 自动完成
显式类型转换 - 需要使用类型函数来转换
"""

# 隐式类型转换
# 两种不同类型的数据进行运算，较低数据类型（整数）就会转换为较高数据类型（浮点数）以避免数据丢失。
num1 = 66
num2 = 6.0
num = num1 + num2
print(1, num1, type(num1))  # 1 66 <class 'int'>
print(2, num2, type(num2))  # 2 6.0 <class 'float'>
print(3, num, type(num))  # 3 72.0 <class 'float'>

# 显式类型转换

# ####
# int(x, base=10) 将一个字符串或数字转换为整型，base：进制数，默认十进制。
# ####
# 不传入参数时，得到结果0
print(4, int())  # 4 0

# 浮点数
print(5, int(3.9))  # 5 3

# 字符串
a = int('111')
print(6, a)  # 6 111

# 二进制转换
#  如果是带参数base的话，待转化的二进制要以字符串的形式进行输入
print(7, int('1111', 2))  # 7 15
print(8, int('0b11111', 2))  # 8 31
print(9, int('0B11110', 2))  # 9 30
# 不带base参数，直接输入二进制
print(10, int(0b1010))  # 10 10
print(11, int(0B1010))  # 11 10
# 八进制
print(12, int('670', 8))  # 12 440
print(13, int('0o670', 8))  # 13 440
print(14, int('0O670', 8))  # 14 440
print(15, int(0o456))  # 15 302
print(16, int(0O456))  # 16 302
# 十六进制
print(17, int('adc9', 16))  # 17 44489
print(18, int('0xadc9', 16))  # 18 44489
print(19, int('0Xadc9', 16))  # 19 44489
print(20, int(0xadc9))  # 20 44489
print(21, int(0Xadc9))  # 21 44489

# ####
# float([x]) 函数用于将整数和字符串转换成浮点数。
# ####
# 不写默认0.0
print(22, float())  # 22 0.0
# 整数
print(23, float(66))  # 23 66.0
print(24, float(-66))  # 24 -66.0
# 字符串
print(25, float('666'))  # 25 666.0
print(26, float('-666'))  # 26 -666.0

# ####
# complex([real[, imag]]) 函数用于创建一个值为 real + imag * j 的复数或者转化一个字符串或数为复数。如果第一个参数为字符串，则不需要指定第二个参数。
# ####
# 不写默认0j
print(27, complex())  # 27 0j
# 指定实部和虚部
print(28, complex(1, 2))  # 28 (1+2j)
# 指定实部
print(29, complex(1))  # 29 (1+0j)
# 字符串，不需要输入虚部，"+"两边不能有空格
print(30, complex('3'))  # 30 (3+0j)
print(31, complex('3-4j'))  # 31 (3-4j)

# ####
# str(object='') 函数将对象转化为适于人阅读的形式
# ####
# 不写参数则空字符串
print(32, str())  # 32
# 数字
print(33, str(222), str(-333))  # 33 222 -333
print(34, str(0b11011))  # 34 27
print(35, str(1 + 2j))  # 35 (1+2j)
print(36, str(False))  # 36 False
# 列表
print(37, str([1, 2, 3, 4, 'a']))  # 37 [1, 2, 3, 4, 'a']
# 元组
print(38, str(('a', [1, 2, 3], 2)))  # 38 ('a', [1, 2, 3], 2)
# 集合
print(39, str({22, 44, 'aa'}))  # 39 {'aa', 44, 22}
# 字典
print(40, str({'google': 'google.com', 'runoob': 'runoob.com'}))  # 40 {'google': 'google.com', 'runoob': 'runoob.com'}

# ####
# repr(object) 函数将对象转化为供解释器读取的形式。
# Return the canonical string representation of the object.
# ####
# 不写参数则空字符串
print(41, repr('sixmillions'))  # 41 'sixmillions'
print(42, repr({'google': 'google.com', 'runoob': 'runoob.com'}))  # 42 {'google': 'google.com', 'runoob': 'runoob.com'}
print(43, repr([1, 2, 3]))  # 43 [1, 2, 3]
print(44, type(repr([1, 2, 3])))  # 44 <class 'str'>

# ####
# eval(expression[, globals[, locals]]) 函数用来执行一个字符串表达式，并返回表达式的值。
# expression -- 表达式。
# globals -- 变量作用域，全局命名空间，如果被提供，则必须是一个字典对象。
# locals -- 变量作用域，局部命名空间，如果被提供，可以是任何映射对象。
# ####
x = 6
print(45, eval('x**2'))  # 45 36
print(46, eval('pow(2,2)'))  # 46 4
print(47, eval('2 + 2 * 3.0'))  # 47 8.0

# ####
# tuple( iterable ) 函数将可迭代系列（如列表）转换为元组。
# iterable -- 要转换为元组的可迭代序列。
# ####
list1 = ['Google', 'Taobao', 'Runoob', 'Baidu']
print(48, tuple(list1))  # 48 ('Google', 'Taobao', 'Runoob', 'Baidu')

# ####
# list( seq ) 方法用于将元组或字符串转换为列表。
# seq -- 要转换为列表的元组或字符串。
# ####
# 空的列表
print(49, list())  # 49 []
# 元组转列表
print(50, list((1, 2, 3)))  # 50 [1, 2, 3]
# 字符串转list
print(51, list("sixmillions"))  # 51 ['s', 'i', 'x', 'm', 'i', 'l', 'l', 'i', 'o', 'n', 's']
